package leetcode.string;

/*
 3. 无重复字符的最长子串

 给定一个字符串，请你找出其中不含有重复字符的 最长子串 的长度。

 示例 1:
 输入: "abcabcbb"
 输出: 3
 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

 示例 2:
 输入: "bbbbb"
 输出: 1
 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。

 示例 3:
 输入: "pwwkew"
 输出: 3
 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。

 请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
*/

import java.util.HashMap;
import java.util.Map;

public class LengthOfLongestSubstring3 {

    public static void main(String[] args) {

        //String s = "abcabcbb";
        //String s = "au";
        //String s = "";
        //String s = "aab";
        String s = "dvdf";

        System.out.println(s);
        System.out.println(test(s));
    }

    public static int test(String s) {
        if (null == s || s.isEmpty())
            return 0;

        byte[] bytes = s.getBytes();

        if(bytes.length < 3) {
            if(2 == bytes.length && bytes[0] != bytes[1])
                return 2;
            else
                return 1;
        }

        Map stringMap = new HashMap();
        StringBuffer sb = new StringBuffer();
        int pos = 0;

        int maxLength = 1;

        for(int i = 0; i < bytes.length - 1; i++) {
            // 如果字符池中没有数据，则将i目前指向的字符放入字符池中
            if (0 == sb.length()) {
                sb.append((char)bytes[i]);
            }

            pos = i;

            for (int j = pos+1; j < bytes.length; j++) {
                // 如果相邻的两个字符不同
                if(bytes[pos] != bytes[j]) {
                    if(sb.indexOf(String.valueOf((char)bytes[j])) < 0) {
                        sb.append((char)bytes[j]);
                        pos = j;
                    } else {
                        if(!stringMap.containsKey(sb.toString())) {
                            stringMap.put(sb.toString(), sb.toString());
                        }

                        sb.delete( 0, sb.length() );
                        break;
                    }
                } else {
                    if(!stringMap.containsKey(sb.toString())) {
                        stringMap.put(sb.toString(), sb.toString());
                    }

                    sb.delete( 0, sb.length() );
                    break;
                }
            }
        }

        if(sb.length() > 0) {
            if(!stringMap.containsKey(sb.toString())) {
                stringMap.put(sb.toString(), sb.toString());
            }
        }

        for (Object key: stringMap.keySet()) {
            String t = key.toString();
            maxLength = key.toString().length() > maxLength ? key.toString().length() : maxLength;
        }

        return maxLength;
    }
}
